package com.cll.netty.netty.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * 说明
 * 1. 我们自定义一个Handler 需要继承netty 规定好的某个HandlerAdapter(规范)
 * 2. 这时我们自定义一个Handler，才能称为一个handler
 */
// 1. 第一种方法
// public class NettyServerHandler extends ChannelInboundHandlerAdapter {
// 2. 第二种方法
public class NettyServerHandler extends SimpleChannelInboundHandler<StudentPOJO.Student> {


    /*
    1. 第一种方法
    @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
        // 读取从客户端发送的StudentPojo.Student
        StudentPOJO.Student student = (StudentPOJO.Student) msg;
        System.out.println("客户端发送的数据 id=" + student.getId() + " 名字=" + student.getName());

    }*/

    /**
     * 2. 第二种方法
     * @param ctx
     * @param student
     * @throws Exception
     */
    @Override
    public void channelRead0(final ChannelHandlerContext ctx, StudentPOJO.Student student) throws Exception {
        // 读取从客户端发送的StudentPojo.Student

        System.out.println("客户端发送的数据 id=" + student.getId() + " 名字=" + student.getName());

    }



    // 数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws  Exception{

        // writeAndFlush 是write + flush
        // 将数据写入到缓存，并刷新
        // 一般讲，我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello，客户端~", CharsetUtil.UTF_8));
    }

    // 处理异常，一般是需要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
